using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.Controladores
{
    public class GestorReporteDinamico
    {
        private IDALReporteDinamico persistencia;

        #region Constructores
        public GestorReporteDinamico()
		{            
            this.persistencia = DALProvider.GetDALReporteDinamico();
		}
        #endregion

        #region Metodos
        /// <summary>
        /// Obtiene las tablas para las cuales pueden realizarse reportes
        /// </summary>
        /// <returns>Listado de tablas disponibles</returns>
        public List<ReporteTabla> ObtenerTablasConsulta()
        {
            return persistencia.GetTablas();
        }

        /// <summary>
        /// Obtiene las columnas disponibles para una tabla determinada
        /// </summary>
        /// <param name="tabla">Tabla de la cual se desean obtener las columnas</param>
        /// <returns></returns>
        public List<ReporteCampoColumna> ObtenerColumnasTabla(ReporteTabla tabla)
        { 
            if(tabla == null) throw new Exception("Debe indicar la tabla o vista de la cual se obtendran las columnas");
            tabla = persistencia.CompletarTablaOrigen(tabla);
            return persistencia.GetColumnas(tabla);
        }

        /// <summary>
        /// Ejecuta la consulta en la persistencia y recupera los resultados
        /// </summary>
        /// <param name="tabla">Origen de datos</param>
        /// <param name="camposMostrar">Listado de columnas a visualizar</param>
        /// <param name="camposFiltro">Listado de filtros de busqueda</param>
        /// <returns></returns>
        public DataTable ObtenerResultadosConsulta(ReporteTabla tabla, List<ReporteCampoColumna> camposMostrar, List<ReporteCriterioFiltro> camposFiltro)
        {
            if (tabla == null) throw new Exception("Debe indicar la tabla o vista de la cual se realizara la consulta");
            if (camposMostrar == null || camposMostrar.Count == 0) throw new Exception("Debe indicar las columnas del resultado de la consulta");
            //if (camposFiltro == null || camposFiltro.Count == 0) throw new Exception("Debe indicar los filtros de busqueda");
            if (camposFiltro == null) throw new Exception("Debe indicar los filtros de busqueda");
            
            tabla = persistencia.CompletarTablaOrigen(tabla);
            return persistencia.GetResultadoConsulta(tabla, camposMostrar, camposFiltro);
        }
        #endregion
    }
}
